//package com.trafficsys.modules.loginAndRegister.service.impl;
//
//import com.trafficsys.modules.entity.*;
//import com.trafficsys.modules.loginAndRegister.dao.*;
//import com.trafficsys.modules.loginAndRegister.service.LoginAndRegisterService;
//import com.trafficsys.modules.loginAndRegister.util.SmsSend;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.data.redis.support.atomic.RedisAtomicInteger;
//import org.springframework.stereotype.Service;
//
//import java.sql.Timestamp;
//import java.util.*;
//import java.util.concurrent.TimeUnit;
//
///**
// * @Author Zhao Bin
// * @Date 2021/9/27 8:58
// * @Version 1.0
// */
//@Service
//public class LoginAndRegisterServiceImpl implements LoginAndRegisterService {
//    @Autowired
//    DriverDao driverDao;
//    @Autowired
//    DriveCardDao driveCardDao;
//    @Autowired
//    IdCardDao idCardDao;
//    @Autowired
//    PoliceDao policeDao;
//    @Autowired
//    TravelCardDao travelCardDao;
//    @Autowired
//    SmsSend smsSend;
//    @Autowired
//    private StringRedisTemplate redisTemplate;
//    //时间间隔  错误后间隔1分钟后再试
//    private static final int TIME_INTERVAL = 1;
//    //登录失败重试次数上限制 3次后锁定
//    private static final int FAILED_RETRY_TIMES = 3;
//    // redis 记录用户登录失败次数key
//    private static final String LOGIN_FAILED_COUNT ="LOGIN:FAILED:COUNT:";
//    /**
//     * 根据key获取计数器
//     */
//    private RedisAtomicInteger getRedisCounter(String key){
//        RedisAtomicInteger counter=
//                new RedisAtomicInteger(key,redisTemplate.getConnectionFactory());
//        if(counter.get() == 0){
//            counter.expire(TIME_INTERVAL, TimeUnit.MINUTES);
//        }
//        return counter;
//    }
//
//    /*********************************************   以下驾驶员功能  *********************************************************
//     * 驾驶员注册方法    驾驶员功能
//     * @param driver
//     * @return
//     */
//    @Override
//    public HashMap<String, Object> register(Driver driver) {
//        HashMap<String,Object> map=new HashMap<>();
//        int n=0;
//        try {
//            n=driverDao.insert(driver);
//        }catch (Exception e){
//            e.printStackTrace();
//            map.put("info","该身份证或电话号码已被注册");
//            return map;
//        }
//        if(n>=1){//注册成功
//            map.put("info","注册成功");
//        }else{
//            map.put("info","注册失败");
//        }
//        return map;
//    }
//    /**
//     * 驾驶员登录    驾驶员功能
//     * @param driver
//     */
//    @Override
//    public HashMap<String,Object> driverLogin(Driver driver) {
//        HashMap<String,Object> map= new HashMap<>();
//        Driver driver1;
//        String key;
//        //根据登录方式 获取相应的错误登录次数
//        if(driver.getCardId() != null){
//            key=LOGIN_FAILED_COUNT + driver.getCardId();
//        }else{
//            key=LOGIN_FAILED_COUNT + driver.getPhone();
//        }
//        RedisAtomicInteger counter=getRedisCounter(key);
//        //检测错误登录次数 大于上限则锁定一分钟
//        if(counter.get() >=FAILED_RETRY_TIMES){
//            map.put("info","登录失败次数已达上限，请1分钟后再试！");
//            return map;
//        }
//        if(driver.getCardId() != null){//身份证号码登录
//            driver1=driverDao.loginByCardId(driver);
//        }else{//电话号码登录
//            driver1=driverDao.loginByPhone(driver);
//        }
//        //验证登录是否成功
//        if(driver1 != null){
//            //登录成功后将counter计数器清零
//            counter.set(0);
//            map.put("info","登录成功");
//            //返回登录对象
//            map.put("driver",driver1);
//        }else{
//            //登录失败次数加一
//            counter.getAndIncrement();
//            map.put("info","您已经登录失败"+counter+"次！！");
//        }
//        return map;
//    }
//
//    /**
//     * 驾驶员查询自己驾驶证    驾驶员功能
//     * 查询出来 放入redis缓存中
//     */
//    @Override
//    public HashMap<String, Object> showDriveCard(Driver driver) {
//        HashMap<String,Object> map=new HashMap<>();
//        if(driver.getCardId() !=null){
//            List<DriveCard> driveCards=driveCardDao.getDriveCardByCardId(driver);
//            if(driveCards.size() !=0){
//                map.put("driveCards",driveCards);
//                map.put("info","获取驾驶证信息成功");
//            }else{
//                map.put("info","还没有您的相关驾驶证信息");
//            }
//            return map;
//        }else{
//            map.put("info","请先补全您的身份证信息");
//        }
//        return map;
//    }
//    /**
//     * 驾驶员查询自己行驶证    驾驶员功能
//     */
//    @Override
//    public HashMap<String, Object> showTravelCard(Driver driver) {
//        HashMap<String,Object> map=new HashMap<>();
//        if(driver.getCardId() !=null){
//            List<TravelCard> travelCards=travelCardDao.getTravelCardByCardId(driver);
//            if(travelCards.size() !=0){
//                map.put("travelCard",travelCards);
//                map.put("info","获取行驶证信息成功");
//            }else{
//                map.put("info","还没有您的相关行驶证信息");
//            }
//            return map;
//        }else{
//            map.put("info","请先补全您的身份证信息");
//        }
//        return map;
//    }
//
//    /*********************************************   以下管理员功能  *********************************************************
//     * /添加驾驶证方法   管理员功能
//     * @param driveCard
//     * @return
//     */
//    @Override
//    public HashMap<String, Object> addDriveCard(DriveCard driveCard) {
//        HashMap<String,Object> map= new HashMap<>();
//        //设置当前时间为发证日期
//        Timestamp crateDate = new Timestamp(new Date().getTime());
//        driveCard.setCreateDate(crateDate);
//        //设置有效期
//        Date endDate=new Date();
//        endDate.setYear(endDate.getYear()+6);//有效期为6年
//        Timestamp validPeriod=new Timestamp(endDate.getTime());
//        driveCard.setValidPeriod(validPeriod);
//        //添加到数据库
//        int n=0;
//        try {
//            n=driveCardDao.insert(driveCard);
//        }catch (Exception e){
//            e.printStackTrace();
//            map.put("info","该驾驶证号已存在");
//            return map;
//        }
//        if(n>=1){
//            map.put("info","添加成功");
//        }else{
//            map.put("info","添加失败");
//        }
//        return map;
//    }
//    /**
//     * 添加行驶证方法   管理员功能
//     * @param travelCard
//     * @return
//     */
//    @Override
//    public HashMap<String, Object> addTravelCard(TravelCard travelCard) {
//        HashMap<String,Object> map= new HashMap<>();
//        //设置行驶证有效期
//        Date endDate=new Date();
//        endDate.setYear(endDate.getYear()+10);//有效期为10年
//        Timestamp validPeriod=new Timestamp(endDate.getTime());
//        travelCard.setInvalidDate(validPeriod);
//        int n=0;
//        try {
//            n=travelCardDao.insert(travelCard);
//        }catch (Exception e){
//            e.printStackTrace();
//            map.put("info","该行驶证号已存在");
//            return map;
//        }
//        if(n>=1){
//            map.put("info","添加成功");
//        }else{
//            map.put("info","添加失败");
//        }
//        return map;
//    }
//    /**
//     * 警员登录    管理员功能
//     * @param police
//     * @return
//     */
//    @Override
//    public HashMap<String, Object> policeLogin(Police police) {
//        HashMap<String,Object> map= new HashMap<>();
//        Police police1;
//        String key;
//        //根据登录方式 获取相应的错误登录次数
//        if(police.getCardId() != null){
//            key=LOGIN_FAILED_COUNT + police.getCardId();
//        }else{
//            key=LOGIN_FAILED_COUNT + police.getPhone();
//        }
//        RedisAtomicInteger counter=getRedisCounter(key);
//        //检测错误登录次数 大于上限则锁定一分钟
//        if(counter.get() >=FAILED_RETRY_TIMES){
//            map.put("info","登录失败次数已达上限，请1分钟后再试！");
//            return map;
//        }
//        if(police.getCardId() != null){//身份证号码登录
//            police1=policeDao.loginByCardId(police);
//        }else{//电话号码登录
//            police1=policeDao.loginByPhone(police);
//        }
//        //验证登录是否成功
//        if(police1 != null){
//            //登录成功后将counter计数器清零
//            counter.set(0);
//            map.put("info","登录成功");
//            map.put("police",police1);
//        }else{
//            counter.getAndIncrement();
//            map.put("info","您已经登录失败"+counter+"次！！");
//        }
//        return map;
//    }
//
//    /**
//     *  添加警员方法   管理员功能
//     */
//    @Override
//    public HashMap<String, Object> addPolice(Police police) {
//        HashMap<String,Object> map=new HashMap<>();
//        int n=0;
//        try {
//            n=policeDao.insert(police);
//        }catch (Exception e){
//            e.printStackTrace();
//            map.put("info","该身份证或电话号码已被注册");
//            return map;
//        }
//        if(n>=1){//注册成功
//            map.put("info","添加成功");
//        }else{
//            map.put("info","添加失败");
//        }
//        return map;
//    }
//
//    /*********************************************   以下公用功能  *********************************************************
//     * 添加身份证方法   公用功能
//     * @param idCard
//     * @return
//     */
//    @Override
//    public HashMap<String, Object> addIdCard(IdCard idCard) {
//        HashMap<String,Object> map= new HashMap<>();
//        //设置身份证有效期
//        Date endDate=new Date();
//        endDate.setYear(endDate.getYear()+10);//有效期为10年
//        Timestamp validPeriod=new Timestamp(endDate.getTime());
//        idCard.setValidity(validPeriod);
//        int n=0;
//        try{
//            n=idCardDao.insert(idCard);
//        }catch (Exception e){
//            e.printStackTrace();
//            map.put("info","该身份证已被注册过");
//            return map;
//        }
//        if(n>=1){
//            map.put("info","添加成功");
//        }else{
//            map.put("info","添加失败");
//        }
//        return map;
//    }
//
//    /**
//     * 发送手机验证码   公用功能
//     */
//    @Override
//    public HashMap<String, Object> sendMessage(String phone) {
//        HashMap<String,Object> map=new HashMap<>();
//        //先查询数据库是否有该手机号注册
//        String phone1="";
//        Police police=policeDao.getPoliceByPhone(phone);
//        Driver driver=driverDao.getDriverByPhone(phone);
//        if(driver==null && police==null){
//            map.put("info","该手机号没有绑定用户");
//            return map;
//        }
//        if(police !=null){
//            phone1=police.getPhone();
//        }else{
//            phone1=driver.getPhone();
//        }
//        //生成4位随机
//        Random rd = new Random();
//        int code = rd.nextInt(10000);
//        map=smsSend.send(phone1,Integer.toString(code));
//        if(map.get("info").equals("短信发送成功")){
//            //存入redis  phone为键  code为值    5分钟后失效
//            redisTemplate.opsForValue().set(phone1,code+"",5, TimeUnit.MINUTES);
//        }
//        return map;
//    }
//}
